/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package shaman.storage.impl.util;

import java.util.Iterator;

/**
 *
 * @author dmitriy
 */
public abstract class ConverterIterable<F, T> implements Iterable<T> {

    private final Iterable<? extends F> baseIterable;

    private class ConverterIterator implements Iterator<T> {

        private final Iterator<? extends F> baseIterator;

        public ConverterIterator() {
            baseIterator=baseIterable.iterator();
        }

        public boolean hasNext() {
            return baseIterator.hasNext();
        }

        public T next() {
            F value=baseIterator.next();
            if (value!=null)
                return convert(value);
            else
                return null;
        }

        public void remove() {
            baseIterator.remove();
        }
        
    }

    public ConverterIterable(Iterable<? extends F> baseIterable) {
        this.baseIterable = baseIterable;
    }

    public Iterator<T> iterator() {
        return new ConverterIterator();
    }

    protected abstract T convert(F baseValue);

}
